Unable to translate Unicode character xxx at index xxx to specified code page.
—— 非 UTF-8 字符的过滤
今天在尝试将数据库数据被分到 Azure Storage Table 的时候发生了一个异常:
Microsoft.WindowsAzure.Storage.StorageException: Unable to translate Unicode character \uD83D at index 397 to specified code page.
异常信息倒是写的很清楚,Azure Storage Table 并不支持这个字符。
考虑到我们的业务场景,非 UTF-8 的字符一般都是些 emoji 表情符号,并不影响文本含义,备份之后也只是作为语料进行模型训练的用途,所以暂定将所有文本字段进行过滤,只保留 UTF-8 的字符之后,再写入 Azure Storage Tabke。
于是便有了下面一段代码:
public class Demo
{
private static readonly Encoding _utf8 = Encoding.GetEncoding(
"UTF-8",
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
);
private string _title;
public string Title
{
get
{
return _title;
}
set
{
if (string.IsNullOrEmpty())
_title = value;
_title = _utf8.GetString(_utf8.GetBytes(value));
}
}
}